#region Copyright (c) 2002, 2005 by James Shore
/********************************************************************************************************************
'
' Copyright (c) 2002, 2005 by James Shore
'
' Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated 
' documentation files (the "Software"), to deal in the Software without restriction, including without limitation 
' the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
' to permit persons to whom the Software is furnished to do so, subject to the following conditions:
'
' The above copyright notice and this permission notice shall be included in all copies or substantial portions 
' of the Software.
'
' THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
' THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
' AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
' CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
' DEALINGS IN THE SOFTWARE.
'
'******************************************************************************************************************/
#endregion

#region Instructions
/********************************************************************************************************************
 * 
 * This file allows NUnitAsp to be used with NUnit.  To use, copy this file 
 * into your test project.  For additional information, see the NUnitAsp
 * documentation in your download package or visit
 * http://nunitasp.sourceforge.net.
 * 
 *******************************************************************************************************************/
#endregion

using System;
using NUnit.Framework;
using System.Xml;
using NUnit.Extensions.Asp.AspTester;
using System.Globalization;

namespace NUnit.Extensions.Asp 
{ 
	/// <summary>
	/// Base class for NUnitAsp test fixtures.  Extend this class to use NUnitAsp.
	/// </summary>
	[TestFixture]
	public abstract class WebFormTestCase : CompatibilityAdapter
	{
		private bool setupCalled = false;

		/// <summary>
		/// Do not call.  For use by NUnit only.
		/// </summary>
		[SetUp]
		public void MasterSetUp() 
		{
			setupCalled = true;
			HttpClient.Default = new HttpClient();
			SetUp();
		}

		/// <summary>
		/// Executed before each test method is run.  Override in subclasses to do subclass
		/// set up.  NOTE: The [SetUp] attribute cannot be used in subclasses because it is already
		/// in use.
		/// </summary>
		protected virtual void SetUp()
		{
		}

		/// <summary>
		/// Do not call.  For use by NUnit only.
		/// </summary>
		[TearDown]
		public void MasterTearDown()
		{
			TearDown();
		}

		/// <summary>
		/// Executed after each test method is run.  Override in subclasses to do subclass
		/// clean up.  NOTE: [TearDown] attribute cannot be used in subclasses because it is
		/// already in use.
		/// </summary>
		protected virtual void TearDown()
		{
		}

		/// <summary>
		/// The web form currently loaded by the browser.
		/// </summary>
		protected WebFormTester CurrentWebForm
		{
			get 
			{
				AssertSetUp();
				return new WebFormTester(HttpClient.Default);
			}
		}

		/// <summary>
		/// The web browser.
		/// </summary>
		protected HttpClient Browser 
		{
			get 
			{
				AssertSetUp();
				return HttpClient.Default;
			}
		}

		private void AssertSetUp()
		{
			if (!setupCalled) 
			{
				Fail("A required setup method in WebFormTestCase was not called.  This is probably because you used the [SetUp] attribute in a subclass of WebFormTestCase.  That is not supported.  Override the SetUp() method instead.");
			}
		}
	}









// Everything below this line is for backwards compatibility and may be deleted.

	/// <summary>
	/// For backwards compatibility; will be deprecated in the future.
	/// This class provides convenience methods for common assertions.  You
	/// should use Assert and WebAssert methods instead.
	/// </summary>
	public class CompatibilityAdapter
	{
		/// <summary>
		/// For backwards compatibility; will be deprecated in the future.
		/// </summary>
		public static void AssertTrue(bool condition)
		{
			Assert.IsTrue(condition);
		}

		/// <summary>
		/// For backwards compatibility; will be deprecated in the future.
		/// </summary>
		public static void AssertTrue(string message, bool condition)
		{
			Assert.IsTrue(condition, message);
		}

		/// <summary>
		/// For backwards compatibility; will be deprecated in the future.
		/// </summary>
		public static void AssertEquals(object expected, object actual)
		{
			Assert.AreEqual(expected, actual);
		}

		/// <summary>
		/// For backwards compatibility; will be deprecated in the future.
		/// </summary>
		public static void AssertEquals(string message, object expected, object actual)
		{
			Assert.AreEqual(expected, actual, message);
		}

		/// <summary>
		/// For backwards compatibility; will be deprecated in the future.
		/// </summary>
		public static void AssertNotNull(object o)
		{
			Assert.IsNotNull(o);
		}

		/// <summary>
		/// For backwards compatibility; will be deprecated in the future.
		/// </summary>
		public static void AssertNotNull(string message, object o)
		{
			Assert.IsNotNull(o, message);
		}

		/// <summary>
		/// For backwards compatibility; will be deprecated in the future.
		/// </summary>
		public static void AssertNull(object o)
		{
			Assert.IsNull(o);
		}

		/// <summary>
		/// For backwards compatibility; will be deprecated in the future.
		/// </summary>
		public static void AssertNull(string message, object o)
		{
			Assert.IsNull(o, message);
		}

		/// <summary>
		/// For backwards compatibility; will be deprecated in the future.
		/// </summary>
		public static void AssertSame(object expected, object actual)
		{
			Assert.AreSame(expected, actual);
		}

		/// <summary>
		/// For backwards compatibility; will be deprecated in the future.
		/// </summary>
		public static void AssertSame(string message, object expected, object actual)
		{
			Assert.AreSame(expected, actual, message);
		}

		/// <summary>
		/// For backwards compatibility; will be deprecated in the future.
		/// </summary>
		public static void Fail(string message)
		{
			Assert.Fail(message);
		}

		/// <summary>
		/// For backwards compatibility; will be deprecated in the future.
		/// </summary>
		public static void AssertVisibility(ControlTester tester, bool expectedVisibility)
		{
			if (expectedVisibility) WebAssert.Visible(tester);
			else WebAssert.NotVisible(tester);
		}

		/// <summary>
		/// For backwards compatibility; will be deprecated in the future.
		/// </summary>
		public static void AssertEquals(string[] expected, string[] actual)
		{
			WebAssert.AreEqual(expected, actual);
		}

		/// <summary>
		/// For backwards compatibility; will be deprecated in the future.
		/// </summary>
		public static void AssertEquals(string message, string[] expected, string[] actual)
		{
			WebAssert.AreEqual(expected, actual, message);
		}

		/// <summary>
		/// For backwards compatibility; will be deprecated in the future.
		/// </summary>
		[CLSCompliant(false)]
		public static void AssertEquals(string[][] expected, string[][] actual)
		{
			WebAssert.AreEqual(expected, actual);
		}

		/// <summary>
		/// For backwards compatibility; will be deprecated in the future.
		/// </summary>
		[CLSCompliant(false)]
		public static void AssertEquals(string message, string[][] expected, string[][] actual)
		{
			WebAssert.AreEqual(expected, actual, message);
		}

		/// <summary>
		/// For backwards compatibility; will be deprecated in the future.
		/// </summary>
		[CLSCompliant(false)]
		public static void AssertEqualsIgnoreOrder(string message, string[][] expected, string[][] actual)
		{
			WebAssert.AreEqualIgnoringOrder(expected, actual, message);
		}

		/// <summary>
		/// For backwards compatibility; will be deprecated in the future.
		/// </summary>
		[CLSCompliant(false)]
		public static void AssertSortOrder(string message, string[][] data, int column, bool isAscending, DataType type)
		{
			WebAssert.Sorted(data, column, isAscending, type, message);
		}
	}
}